/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.STCMCUDATA.com  ---------------------------------------*/
/* --- QQ:  800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序            */
/*---------------------------------------------------------------------*/

#include	"config.h"
#include	"gpio.h"
#include	"UART.h"
#include	"delay.h"
#include	"sbus.h"

/*************	功能说明	**************

本例程基于STC8G1K08A为主控芯片进行编写测试，STC8G、STC8H系列芯片可通用参考.

串口中断方式接收SBUS协议通讯程序。

通过接收机机或者飞控向MCU发送数据, MCU收到后通过串口把收到的SBUS协议数据解码成16个通道对应的PWM值, 默认波特率：100 000,偶,9,2.

通过开启 UART.h 头文件里面的 UART1~UART4 定义，启动不同通道的串口通信。

用定时器做波特率发生器，建议使用1T模式(除非低波特率用12T)，并选择可被波特率整除的时钟频率，以提高精度。

下载时, 选择时钟 24 MHz (用户可在"config.h"修改频率).

******************************************/
//输出引脚
#define Vid_Con_Green P54//云台控制
#define Pho_Cap_White P55//云台控制

/*************	本地常量声明	**************/


/*************	本地变量声明	**************/
char sbus_value_str[17][5] = { 0 };//存放字符串形式通道值
	
/*************	本地函数声明	**************/
void Con_Fun(void);//云台控制
void int_to_char(char i,int iNum);
void print_sbus_value(void);

/**********************************************/
void main(void)
{
	GPIO_config();
    GPIO1_config();//云台控制
	UART_config();
	EA = 1;

	while (1)
	{
		Con_Fun();//该函数为本人用于控制一个云台的funtion函数，自己使用时请删除掉该云台控制相关函数及其声明
		
////test 云台控制 IO口
//		if(SBUS_CH.CH13 > Channel_Mid)
//			Vid_Con_Green = 1;
//		else
//			Vid_Con_Green = 0;
//		
//		if(SBUS_CH.CH14 > 1250)
//			Pho_Cap_White = 1;
//		else
//			Pho_Cap_White = 0;
//test 打印出各个通道的值
//		print_sbus_value();
//		delay_ms(500);
	}
}
/*************  本地函数 *****************/
/*功能：整形转字符串
参数：通道序号、通道PWM值
返回值：无
*/
void int_to_char(char i,int iNum)
{
	sbus_value_str[i][0] = iNum / 1000  + '0';
	sbus_value_str[i][1] = iNum / 100 % 10 + '0';
	sbus_value_str[i][2] = iNum / 10 % 10 + '0';
	sbus_value_str[i][3] = iNum % 10 + '0';
	sbus_value_str[i][4] = '\0';   //字符串结速符
}
//串口 打印出各个通道的值
void print_sbus_value(void)
{
	int_to_char(0,SBUS_CH.ConnectState);
	int_to_char(1,SBUS_CH.CH1);
	int_to_char(2,SBUS_CH.CH2);
	int_to_char(3,SBUS_CH.CH3);
	int_to_char(4,SBUS_CH.CH4);
	int_to_char(5,SBUS_CH.CH5);
	int_to_char(6,SBUS_CH.CH6);
	int_to_char(7,SBUS_CH.CH7);
	int_to_char(8,SBUS_CH.CH8);
	int_to_char(9,SBUS_CH.CH9);
	int_to_char(10,SBUS_CH.CH10);
	int_to_char(11,SBUS_CH.CH11);
	int_to_char(12,SBUS_CH.CH12);
	int_to_char(13,SBUS_CH.CH13);
	int_to_char(14,SBUS_CH.CH14);
	int_to_char(15,SBUS_CH.CH15);
	int_to_char(16,SBUS_CH.CH16);
	
	PrintString1("State:");	//UART1发送一个字符串
	PrintString1(&sbus_value_str[0][0]);	//UART1发送一个字符串
		delay_ms(1);
	PrintString1(" CH1:");	//UART1发送一个字符串
	PrintString1(&sbus_value_str[1][0]);	//UART1发送一个字符串
		delay_ms(1);
	PrintString1(" CH2:");	//UART1发送一个字符串
	PrintString1(&sbus_value_str[2][0]);	//UART1发送一个字符串
		delay_ms(1);
	PrintString1(" CH3:");	//UART1发送一个字符串
	PrintString1(&sbus_value_str[3][0]);	//UART1发送一个字符串
		delay_ms(1);
	PrintString1(" CH4:");	//UART1发送一个字符串
	PrintString1(&sbus_value_str[4][0]);	//UART1发送一个字符串
		delay_ms(1);
	PrintString1(" CH5:");	//UART1发送一个字符串
	PrintString1(&sbus_value_str[5][0]);	//UART1发送一个字符串
		delay_ms(1);
	PrintString1(" CH6:");	//UART1发送一个字符串
	PrintString1(&sbus_value_str[6][0]);	//UART1发送一个字符串
		delay_ms(1);
	PrintString1(" CH7:");	//UART1发送一个字符串
	PrintString1(&sbus_value_str[7][0]);	//UART1发送一个字符串
		delay_ms(1);
	PrintString1(" CH8:");	//UART1发送一个字符串
	PrintString1(&sbus_value_str[8][0]);	//UART1发送一个字符串
		delay_ms(1);
	PrintString1(" CH9:");	//UART1发送一个字符串
	PrintString1(&sbus_value_str[9][0]);	//UART1发送一个字符串
		delay_ms(1);
	PrintString1(" CH10:");	//UART1发送一个字符串
	PrintString1(&sbus_value_str[10][0]);	//UART1发送一个字符串
		delay_ms(1);
	PrintString1(" CH11:");	//UART1发送一个字符串
	PrintString1(&sbus_value_str[11][0]);	//UART1发送一个字符串
		delay_ms(1);
	PrintString1(" CH12:");	//UART1发送一个字符串
	PrintString1(&sbus_value_str[12][0]);	//UART1发送一个字符串
		delay_ms(1);
	PrintString1(" CH13:");	//UART1发送一个字符串
	PrintString1(&sbus_value_str[13][0]);	//UART1发送一个字符串
		delay_ms(1);
	PrintString1(" CH14:");	//UART1发送一个字符串
	PrintString1(&sbus_value_str[14][0]);	//UART1发送一个字符串
		delay_ms(1);
	PrintString1(" CH15:");	//UART1发送一个字符串
	PrintString1(&sbus_value_str[15][0]);	//UART1发送一个字符串
		delay_ms(1);
	PrintString1(" CH16:");	//UART1发送一个字符串
	PrintString1(&sbus_value_str[16][0]);	//UART1发送一个字符串
		delay_ms(1);
	PrintString1("\r\n");	//UART1发送一个字符串
}
//功能函数
void Con_Fun(void)
{
//13通道（三段开关）对应：拍照模式
//14通道（回弹开关）对应：切换录像、开始录像、停止录像（循环）
		static u8 Pho_Switch = 0;
		static u8 Video_Switch = 0;
	
		if(SBUS_CH.CH13 < Channel_Top && SBUS_CH.CH13 > Channel_Bot)//中挡
		{
			//拍照模式	
			if(Pho_Switch == 0)
			{
				Pho_Cap_White = 0;
				delay_ms(100);
				Pho_Cap_White = 1;
				Pho_Switch = 1;
			}
			else if(Pho_Switch == 2)
			{
				Pho_Cap_White = 0;
				delay_ms(100);
				Pho_Cap_White = 1;
				Pho_Switch = 1;
			}
			else if(Pho_Switch == 3)
			{
				Pho_Cap_White = 0;
				delay_ms(100);
				Pho_Cap_White = 1;
				Pho_Switch = 1;
			}
		}
		else if(SBUS_CH.CH13 > Channel_Mid)//下挡
		{
			if(Pho_Switch == 0)
			{
				Pho_Cap_White = 0;
				delay_ms(100);
				Pho_Cap_White = 1;
				Pho_Switch = 2;
			}
			else if(Pho_Switch == 1)
			{
				Pho_Cap_White = 0;
				delay_ms(100);
				Pho_Cap_White = 1;
				Pho_Switch = 2;
			}
			else if(Pho_Switch == 3)
			{
				Pho_Cap_White = 0;
				delay_ms(100);
				Pho_Cap_White = 1;
				Pho_Switch = 2;
			}
		}
		else//上挡,初始时不动
		{
			if(Pho_Switch == 1)
			{
				Pho_Cap_White = 0;
				delay_ms(100);
				Pho_Cap_White = 1;
				Pho_Switch = 3;
			}
			else if(Pho_Switch == 2)
			{
				Pho_Cap_White = 0;
				delay_ms(100);
				Pho_Cap_White = 1;
				Pho_Switch = 3;
			}
		}

		//录像部分	
	  if(SBUS_CH.CH14 > 1250)//下挡
		{
			//录像模式
			if(Video_Switch == 0)
			{
				Vid_Con_Green = 0;
				delay_ms(100);
				Vid_Con_Green = 1;
				Video_Switch = 1;
			}
		}
		else//上挡
		{
			//上挡，不发生动作
			Video_Switch = 0;
		}
}



